package pro1_echoServer;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;

@ChannelHandler.Sharable // 标识一个 ChannelHandler 可以被多个 Channel 安全地共享
public class EchoServerHandler extends ChannelInboundHandlerAdapter{

    // 读取数据
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        // 将接收到的消息转换为 ByteBuf 类型
        ByteBuf in = (ByteBuf) msg;

        // 打印接收到的消息内容，假设消息是UTF-8编码的
        System.out.println("服务器收到消息: " + in.toString(CharsetUtil.UTF_8));

        // 将接收到的消息写回给发送者，但并不会立刻冲刷出去（即不立刻发送）
        ctx.write(in);
    }

    // 通知 ChannelInboundHandler 最后一次对 channelRead() 的调用是当前批量读取中的最后一条消息
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        // 将所有待处理的消息冲刷到远程节点（即真正发送出去），并在完成后关闭连接
        ctx.writeAndFlush(Unpooled.EMPTY_BUFFER) // 使用空缓冲区完成最后的冲刷
                .addListener(ChannelFutureListener.CLOSE); // 在消息发送完成后关闭连接
    }

    // 处理异常，释放资源
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        // 打印异常堆栈信息
        cause.printStackTrace();

        // 关闭与客户端的连接
        ctx.close();
    }
}
